#include <stdio.h>
#include <math.h>

//将int转成int数组 第一位存长度 好按位比较大小
int* formatInt(int a)
{
    double tmp=log10(a);
    int len=(int)tmp+1;
    int * array=new int[len+1];
    array[0]=len;

    int tmp2=a;
    for(int i=0;i<len;i++)
    {
        array[len-i]=tmp2%10;
        tmp2/=10;
    }
    return array;
}

int min(int a1,int a2)
{
    return a1>a2?a2:a1;
}

/**
 *对比大小 0代表相等 1代表a1<a2 -1代表a1>a2
 */
int compare(int * a1,int * a2)
{
    int len1=a1[0];
    int len2=a2[0];
    int start1=1;
    int start2=1;
    int i;
    while (len1>0&&len2>0)
    {
        /* code */
        int len=min(len1,len2);
        for(i=0;i<len;i++)
        {
            if(a1[start1+i]>a2[start2+i])
            {
                return -1;
            }
            else if(a1[start1+i]<a2[start2+i])
            {
                return 1;
            }
        }


        if(len1>len2)
        {
            start1+=len2;
            len1-=len2;
        }
        else{
            start2+=len1;
            len2-=len1;
        }
        
    }

    if(a1[0]>a2[0])
    {
        return 1;
    }
    else if(a1[0]<a2[0])
    {
        return -1;
    }
    else{
        return 0;
    }
}

void printArray(int** array,int n)
{
    for(int i=0;i<n;i++)
    {
        for(int j=1;j<=array[i][0];j++)
        {
            printf("%d",array[i][j]);
        }
        // printf("\n");
    }
    // printf("\n");
    printf("\n");
}

void printCompare(int * a1,int * a2,int result)
{
    printf("a1:");
    int j;
    for(j=1;j<=a1[0];j++)
    {
        printf("%d",a1[j]);
    }
    printf("\n");

    printf("a2:");
    for(j=1;j<=a2[0];j++)
    {
        printf("%d",a2[j]);
    }
    printf("\n");

    printf("result:%d\n",result);
}

int main(){
    int n;
    int **array;

    int i,j;
    int tmp;

    scanf("%d",&n);

    array=new int*[n];

    for(i=0;i<n;i++)
    {
        scanf("%d",&tmp);
        array[i]=formatInt(tmp);
    }
    // printArray(array,n);

    //队列记录快排
    int** queue=new int*[n];
    int start=0;
    int end=1;
    queue[start]=new int[2];
    queue[start][0]=0;
    queue[start][1]=n;
    //开始快排
    while (start<end)
    {
        int s=queue[start][0];
        int e=queue[start][1];
        
        i=s;
        j=e-1;
        int tmpIndex=j;
        int* tmp=array[tmpIndex];
        while (i<j)
        {
            if(tmpIndex==j)
            {
                int flag=compare(array[i],tmp);
                // printCompare(array[i],tmp,flag);
                //前面大于后面
                if(flag>0)
                {
                    array[tmpIndex]=array[i];
                    tmpIndex=i;
                    // tmp=array[tmpIndex];
                }
            }
            else
            {
                int flag=compare(tmp,array[j]);
                // printCompare(tmp,array[j],flag);
                //前面大于后面
                if(flag>0)
                {
                    array[tmpIndex]=array[j];
                    tmpIndex=j;
                    // tmp=array[tmpIndex];
                }
            }

            if(tmpIndex==j)
            {
                i++;
            }
            else{
                j--;
            }

            
        }

        array[i]=tmp;

        // printf("%d %d %d\n",s,e,i);
        // printArray(array,n);

        start++;
        if(s<i)
        {
            end++;
            queue[end-1]=new int[2];
            queue[end-1][0]=s;
            queue[end-1][1]=i;
        }

        if(i+1<e)
        {
            end++;
            queue[end-1]=new int[2];
            queue[end-1][0]=i+1;
            queue[end-1][1]=e;
        }
    }

    printArray(array,n);
    

    for(i=0;i<n;i++)
    {
        delete array[i];
    }
    delete array;

    for(i=0;i<end;i++)
    {
        delete queue[i];
    }
    delete queue;
    
    return 0;
}